package com.cskaoyan.javase.oop2.override8;

/**
 * @description: 方法的覆盖
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 1，父子类当中方法允许有同名的吗？
 * 允许有方法的同名
 * 2，同名后用子类对象调用子类中的方法,我们发现会直接调用子类的方法,这里又有两种猜想了
 *      1,方法也被隐藏
 *      2,方法被覆盖了
 *
 *  你使用对象点方法名的形式调用方法的时候,也存在一种检索机制
 *  当前类去找--->去父类中找---->直到Object类找不到----->报错
 *
 *  方法是被覆盖掉了,而不是隐藏了
 *  覆盖只是指对象名点访问的形式被覆盖掉了
 *
 *  如果你想要在子类方法中,去调用父类方法
 *  super
 *
 *
 *  什么时候使用方法的覆盖？
 * - 当我们需要在子类中，修改父类方法的实现的时候
 * - 使用方法的覆盖时，一定要添加@Override注解来标记
 * - 例如：比如对于动物的叫，人类的吃
 *
 * 方法的覆盖注意事项:
 * - 父类中私有方法不能被重写 因为父类的私有成员方法只能摸摸 但是没有权限使用
 * - 子类重写父类方法时，访问权限不能更低
 * - 静态方法在使用现象上，很像是被重写了，但实际上静态方法不能被重写，而是直接是一个新的静态成员方法
 * 静态的成员就用类名访问就行了 不要考虑太多
 *
 *
 */
public class Demo {
    public static void main(String[] args) {
        Son son = new Son();
        son.sameMethod(1);

        //分别用子类对象调用这两个方法
        son.testSon(); //222222
        //如果这里输出11111,代表方法是被隐藏了,因为你还可以调用到Father中的方法
        //如果这里输出22222,代表方法是被覆盖了.因为你已经调不到父类中这个方法了,它被干掉了
        son.testFather();  //222222
    }
}

class Father{
    public void sameMethod(int a){
        System.out.println("111111");
    }

    //写一个方法,让这个方法调用sameMethod
    public void testFather(){
        sameMethod(1);
    }
}
class Son extends  Father{
    /*@Override //放在被重写的方法的头上面  @Override注解会从语法上检查 该方法是否是方法重写,如果不是就报错
    public void sameMethod(){
        System.out.println("2222222");
    }*/

    //以后大家重写方法,一律不要手写,使用快捷键,如果想重写父类中sameMethod这个方法,直接在子类中打sameMethod字符串
    //@Override
    //public void sameMethod() {
    //    //自己去重写方法 实现
    //    System.out.println("22222222");
    @Override //提升代码可读性
    public void sameMethod(int a) {
        //super.sameMethod();
    }

    //上午讲了一个clone方法
    //@Override
    //protected Object clone() throws CloneNotSupportedException {
    //    return super.clone();
    //}

    //写一个方法,让这个方法调用sameMethod
    public void testSon(){
        super.sameMethod(1); //1111
    }
}
